package cn.fansunion.leecode.number;

/**
 * 给你一个非负整数 x ，计算并返回 x 的 算术平方根 。
 * 
 * 由于返回类型是整数，结果只保留 整数部分 ，小数部分将被 舍去 。
 * 
 * 注意：不允许使用任何内置指数函数和算符，例如 pow(x, 0.5) 或者 x ** 0.5 。
 * 
 * 来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/sqrtx 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * 
 * @author wen.lei@brgroup.com
 *
 *         2022-1-26
 */
public class Sqrtx {

    /**
     * 只要整数位,比如x=16，先用1,1*1<16;需要调整当前值，最小值为2， (2+16)/2=9，9*9>16，最大为9-1=8
     * 
     * @param x
     * @return
     */
    public int mySqrtBug(int x) {
        int min = 0;
        int max = x;
        int num = min;
        // num * num != x，核心条件，如果能找到，直接退出while返回num
        // min逐步+1，max逐步-1，min<max可以确保退出while
        while (num * num != x && min <= max) {
            int currentNum = num;
            if (num * num < x) {
                // num = (min + max) / 2;
                num = Math.max(num + 1, (min + max) / 2);
                min = currentNum + 1;
            } else if (num * num > x) {
                // num =(min + max) / 2;
                num = Math.max(num - 1, (min + max) / 2);
                max = currentNum - 1;
            }
        }
        if (num * num == x) {
            return num;
        }
        if (min > max) {
            return max;
        }
        return num;
    }

    /**
     * 如果支持到小数点呢
     * 
     * @param x
     * @return
     */
    public double mySqrtDouble(int x) {
        return 0D;

    }
}
